/*********************************************************
*Copyright (c) 2009 Rob Groves. All Rights in Pw
*@des: message
*@name: message.h
*@author: zhognsx
*@time: 2015-11-16
*********************************************************/
#ifndef __MESSAGE_H_
#define __MESSAGE_H_

#include <iostream>
#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/pool/pool.hpp>

typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;


#define MIN_LEN 10240 

// 报文头的结构,这个是公共的消息结构头
//重复定义报文头结构体，方便取数据
struct msgHead
{
	msgHead()
	{
		dwSize = sizeof(msgHead);
		dwCommand = 0xffffffff;
	}

	uint32_t	dwSize;						// 总长度 = 报文头 ＋ 报文内容(不定长)
	uint32_t	dwCommand;					// 命令
	uint32_t    dwVersion;					// 预留
};

//提供对自定义msg的封装
//message 缓冲区 
//不能竞争操作
class message
{
public:
	message();

	virtual ~message();

	const char* data() const;

	char* data();

	char* header();

	char* body();

	void reset();
	//分配空间
	void malloc(int size);

	//自定义扩展内存
	void relloc(uint32_t size);

	//封装数据
	void encode_data(const char* data, int length);

	int length();

	int header_len();

	//在调用时 数据区已写入sizeof(msgHead) 大小的数据
	int body_len();

	void add_wlen(int size);

	int get_mlen();
private:
	uint8_t* data_;
	int wlen; //写的数据大小
	int mlen; //当前数据区最大长度
	//内存池 分配器shared指针
	//boost::shared_ptr<boost::pool<> > pool;
};


#endif //__MESSAGE_H_